home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / oper_sys / choices / chcssml1.lha / SoftwareException.c < prev    next >
C/C++ Source or Header  |  1989-02-06  |  3KB  |  93 lines

  1. /*
  2.  * This file is part of the Choices Operating System Simulator
  3.  * Developed by: The TAPESTRY Parallel Computing Laboratory
  4.  *         University of Illinois at Urbana-Champaign
  5.  *         Department of Computer Science
  6.  *         1304 W. Springfield Ave.
  7.  *         Urbana, IL    61801
  8.  *
  9.  * Copyright (c) 1987, 1988, 1989 The University of Illinois Board of Trustees.
  10.  *    All Rights Reserved.
  11.  * CONFIDENTIAL INFORMATION. Distribution restricted under license agreement.
  12.  *
  13.  * Author: Gary M. Johnston (johnston@cs.uiuc.edu)
  14.  * Project Manager and Principal Investigator: Roy Campbell (roy@cs.uiuc.edu)
  15.  *
  16.  * Funded by: NSF TAPESTRY Grant No. 1-5-30035, NASA ICLASS Grant 
  17.  *   No. 1-5-25469 and No. NSG1471 and AT&T Metronet Grant No. 1-5-37411.
  18.  */
  19. /*
  20.  * SoftwareException.c - Implementations of classes SoftwareException and
  21.  *             SemaphoreException.
  22.  *
  23.  *    $Header$
  24.  *    $Locker$
  25.  */
  26.  
  27. #include "Assert.h"
  28. #include "Debug.h"
  29. #include "Process.h"
  30. #include "CPU.h"
  31. #include "Clock.h"
  32. #include "Name.h"
  33. #include "Exception.h"
  34. #include "SoftwareException.h"
  35. #include "ProcessContainer.h"
  36.  
  37. SoftwareException::SoftwareException(char * name):
  38.     (name ? name : MakeName( "SoftwareException", this) )
  39. {
  40. }
  41.  
  42. void SoftwareException::raise()
  43. {
  44.     Debug("%s::raise(%s).\n", getName(), ThisCPU()->getName());
  45.     ThisCPU()->trap(this);
  46.     Debug("%s::raise(%s) return.\n", getName(), ThisCPU()->getName());
  47. }
  48.  
  49. void
  50. SoftwareException::handle(CPU * cpu, int vector)
  51. {
  52.     Debug( "%s::handle(%s).\n", getName(), cpu->getName());
  53. }
  54.  
  55. SemaphoreException::SemaphoreException(char * name, Semaphore * s ):
  56.     (name ? name : MakeName( "SemaphoreException", this) )
  57. {
  58.     saveSemaphore = s; //This is the semaphore that is being served.
  59. }
  60.  
  61. void
  62. SemaphoreException::handle(CPU * cpu, int vector)
  63. { //Interrupts are off, and this is a critical section.
  64.     Debug( "%s::handle(%s).\n", getName(), cpu->getName());
  65.     Assert(cpu != 0);
  66.     Process * current = cpu->remove();
  67.     Assert( current != 0 );
  68.     Assert( current != cpu->idleProcess );
  69.  
  70.     /*
  71.       * Remove the current process from the processor.
  72.      * Try to remove a Process from the CPU's scheduler.
  73.      * Dispatch the new Process or the IdleProcess.
  74.      * Save the process on the saveQ. Be sure
  75.      * to never enqueue the idle process anywhere.
  76.      */
  77.  
  78.     Assert( saveSemaphore != 0 );
  79.     saveSemaphore->queue->add( current ); //Put process on semaphore queue.
  80.     Debug( "SoftwareException::handle: enqueued %A\n",
  81.             current );
  82.  
  83.     ProcessContainer * scheduler = cpu->scheduler;
  84.     Assert( scheduler != 0 );
  85.     Process * newProcess = scheduler->remove(); //Get another process
  86.     if( newProcess == 0 ) newProcess = cpu->idleProcess;
  87.     Assert( newProcess != 0 );
  88.     Debug("%s::handle:add %s to %s.\n",
  89.         getName(), newProcess->getName(), cpu->getName());
  90.     saveSemaphore->locked = 0; //Reset Semaphore lock to exit critical sect.
  91.     cpu->add( newProcess ); //Run process on CPU
  92. }
  93.